package icu.xblogs.report.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

/**
 * @author Frank KONG
 * @version 1.0
 * @date 2020/8/4 18:45
 */

/**
 * JWT(JSON Web Token)身份验证
 * 三大部分：
 *      1.header
 *          默认：{"typ":"JWT","alg":"HS256"}
 *      2.playload
 *          2.1标准的声明(建议但不强制)
 *              iss: jwt签发者
 *              sub: jwt所面向的用户
 *              aud: 接收jwt的一方
 *              exp: jwt的过期时间，这个过期时间必须要大于签发时间
 *              nbf: 定义在什么时间之前，该jwt都是不可用的.
 *              iat: jwt的签发时间
 *              jti: jwt的唯一身份标识，主要用来作为一次性token
 *          2.2公共的声明(一般添加用户的相关信息或其他业务需要的必要信息)
 *          2.3私有的声明(提供者和消费者所共同定义的声明)
 *          example:{"sub":"1234567890","name":"John Doe","admin":true}
 *      3.signature
 *          HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
 */
public class JwtUtil {

    private static final String SECRET = "2019_Frank_KONG"; //加盐secret,仅在服务器可见
    private static final String AUDIENCE = "xblogs";        //jwt接收者

    /**
     * 把id以字符串的形式传进来，进行加密
     * @param id
     * @return
     */
    public static String getJWT(String id){
        return JWT.create()
                .withAudience(AUDIENCE)
                .withClaim("id", id)
                .sign(Algorithm.HMAC256(SECRET));
    }

    /**
     * 从jwt中解析id,一般用不到,只是给出解析JWT的方式
     * @param token
     * @return
     */
    public static String getIdFormJWT(String token){
        return JWT.decode(token).getClaim("id").asString();
    }
}
